package me.ydq;


import me.ydq.convert.ColumnConvert;
import me.ydq.convert.TableConvert;
import me.ydq.core.Table;
import me.ydq.dialect.Dialect;
import me.ydq.mapper.RowMapperProvider;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;

/**
 * 动态查询具体的实现类，默认不对外暴露，别问我为什么取这个名字，你猜
 */
record YummyDynamicQuery(NamedParameterJdbcTemplate jdbcTemplate,
                         Dialect dialect,
                         TableConvert tableConvert,
                         ColumnConvert columnConvert,
                         RowMapperProvider rowMapperProvider) implements DynamicQuery {

    public <T> Table<T> table(Class<T> cls) {
        return Table.newInstance(jdbcTemplate, dialect, cls, dialect.wordWrap(tableConvert.convert(cls)), columnConvert, rowMapperProvider.build(cls));
    }

    /**
     * 指定表名，用于部分实体和其他实体定义的表名转换不一致的特殊处理
     */
    public <T> Table<T> table(Class<T> cls, String tableName) {
        return Table.newInstance(jdbcTemplate, dialect, cls, tableName, columnConvert, rowMapperProvider.build(cls));
    }

    /**
     * 指定表名转换器，适用于部分实体和其他实体定义的表名转换不一致的特殊处理
     */
    public <T> Table<T> table(Class<T> cls, TableConvert tableConvert) {
        return Table.newInstance(jdbcTemplate, dialect, cls, dialect.wordWrap(tableConvert.convert(cls)), columnConvert, rowMapperProvider.build(cls));
    }

    /**
     * 如果自定义 列名转换器，大概率 读取出来的对象也需要定制 RowMapper，适用于部分实体和其他实体定义的不一致的特殊处理
     */
    public <T> Table<T> table(Class<T> cls, String tableName, ColumnConvert columnConvert, RowMapper<T> rowMapper) {
        return Table.newInstance(jdbcTemplate, dialect, cls, tableName, columnConvert, rowMapper);
    }

    /**
     * 如果自定义 列名转换器，大概率 读取出来的对象也需要定制 RowMapper，适用于部分实体和其他实体定义的不一致的特殊处理
     */
    public <T> Table<T> table(Class<T> cls, TableConvert tableConvert, ColumnConvert columnConvert, RowMapper<T> rowMapper) {
        return Table.newInstance(jdbcTemplate, dialect, cls, dialect.wordWrap(tableConvert.convert(cls)), columnConvert, rowMapper);
    }
}
